home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).zip
/
Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).adf
/
Create
/
Create.S
< prev
next >
Wrap
Text File
|
1993-07-27
|
8KB
|
206 lines
;************** Create <name>,b1,b2,... ***************
;* *
;* Erstellt eine Datei mit dem Namen <name> und be- *
;* liebigen Bytes, die - mit Kommas getrennt - auf- *
;* gezählt werden. *
;* *
;******************************************************
;* © 1991 by Michael Gottwald *
;******************************************************
OpenLib = -408 ; EXEC-Library
CloseLib = -414 ; '
Open = -30 ; DOS-Library
Close = -36 ; '
Write = -48 ; '
Output = -60
Exit = -144 ; '
;----Librarys öffnen--------------------------------------------------
run: move.l a0,Pointer ; Zeiger auf Parametertext retten
move.l d0,ErrAdr ; Parametertextlänge retten
move.l $4,a6
lea Dosname,a1
jsr OpenLib(a6) ; dos.library öffnen
move.l d0,DosBase
bne getName ; O.k, --> weiter
rts ; Fehler beim Öffnen, --> CLI
;----Dateinamen holen ------------------------------------------------
getName: move.l Pointer,a0
subq.l #1,ErrAdr ; Kommen Parameter (ErrAdr = 1) ?
bne noSpace ; ja, --> weiter
move.l #NoParErr,ErrAdr ; nein, --> Befehlsschablone
bra error ; ausgeben und Ende
noSpace: cmp.b #32,(a0)+
beq noSpace ; Leerzeichen überlesen...
move.l #FileName,a1
subq.l #1,a0
cmp.b #44,(a0) ; kommt schon Komma ?
bne chkRet ; nein, --> weiter
move.l #NoFileErr,ErrAdr
bra Error ; ja, --> Fehlermeldung ausgeben
chkRet: cmp.b #10,(a0) ; kommt schon Line_feed ?
bne readNme ; nein, --> Zieldatei holen
move.l #NoFileErr,ErrAdr
bra Error ; ja, --> Fehlermeldung ausgeben
readNme: move.b (a0)+,(a1)+ ; Zeichen speichern...
cmp.b #44,(a0) ; kommt Komma ?
beq openFile ; ja, --> Zieldatei öffnen
cmp.b #10,(a0) ; kommt Line_feed ?
bne readNme ; nein, --> weiterlesen
btError: move.l #NoBytErr,ErrAdr
bra Error ; LF, --> Fehlermeldung ausgeben
openFile: addq.l #1,a0
move.l a0,Pointer ; Zeiger auf Parametertext retten
move.l DosBase,a6
move.l #FileName,d1 ; Zeiger auf Dateidefinition
move.l #1006,d2 ; Modus 'new'
jsr Open(a6) ; Datei öffnen
move.l d0,Handle ; Dateihandle retten
bne getByte ; hat geklappt, --> Byte holen
move.l #OpenErr,ErrAdr
bra error ; hat nicht geklappt, --> Fehler
;----Dezimalzahl holen -----------------------------------------------
getByte: move.l Pointer,a0 ; Zeiger auf Textpuffer holen
nextByte:bsr getdez ; Dezimalzahl (Byte) holen
cmp.w #255,d0 ; kleiner/gleich 255 ?
bls WrFile ; ja, --> weiter
move.l #ByteErr,ErrAdr
bra error ; --> Fehlermeldung ausgeben
WrFile: move.l a0,Pointer ; Parametertext-Zeiger retten
move.l DosBase,a6
move.b d0,Byte
move.l #Byte,d2 ; Zeiger auf Byte...
move.l Handle,d1 ; Dateihandle...
move.l #1,d3 ; Länge: 1
jsr Write(a6) ; Byte schreiben
tst.l d0 ; D0 testen
bmi WrError ; negativ, --> Schreibfehler
move.l Pointer,a0 ; Param.text-Zeiger zurückholen
cmp.b #44,(a0)+ ; kommt Komma ?
beq nextByte ; ja, --> nächstes Byte holen
subq.l #1,a0 ; nein, --> Zeiger zurückbiegen
cmp.b #10,(a0) ; kommt Line_feed ?
bra end ; ja, --> Ende
move.l #SyntaxErr,ErrAdr
bra error ; nein, --> Fehler
wrError: move.l #WriteErr,ErrAdr
bra error ; --> Fehler
end: move.l DosBase,a6
move.l Handle,d1
jsr Close(a6) ; Datei schließen
move.l DosBase,a6
clr.l d1 ; Returncode = 0 (kein Fehler)
jsr Exit(a6) ; zurück ins CLI
;----Dezimalzahl auswerten--------------------------------------------
getdez: cmp.b #32,(a0)+ ; Leerzeichen überlesen
beq getdez
clr.l d0
subq.l #1,a0
move.l #2,d1 ; Ziffernzähler setzen
clr.w Numbers
loop2: move.b (a0)+,d0 ; nächstes Zeichen holen
cmp.b #10,d0 ; Line_feed ?
beq back ; dann keine Ziffer mehr
cmp.b #44,d0 ; Komma ?
beq back ; dann keine Ziffer mehr
lea Numbers,a1 ; Basisadresse der Zifferspeicher
add.l d1,a1
sub.l #48,d0 ; ASCII-Code - 48 = Zifferwert
move.b d0,(a1) ; Ziffer abspeichern
dbra d1,loop2 ; D1 dekrementieren / D1 = 0 ?
bra ready
back: subq.l #1,a0 ; A0 auf Komma biegen
ready: addq.w #1,d1
clr.l d0
cmp.b #3,d1 ; D1 noch 2 ?
bne cont
add.l #4,a7 ; ja, dann keine Ziffer gefunden
move.l #NoBytErr,ErrAdr
bra error ; --> Fehlermeldung ausgeben
cont: lea Muls,a2 ; Basisadr. der Multiplikatoren
add.l d1,a2
lea Numbers,a1
clr.l d0
clr.l d1
clr.l d2
move.b 2(a1),d0 ; /Beide Bytes holen, damit wort-
move.b (a2),d1 ; \weise multipliz. werden kann
mulu d1,d0 ; 1. Ziffer * Multiplikator
addq.l #1,a2
move.b 1(a1),d1
move.b (a2),d2
mulu d2,d1 ; 2. Ziffer (falls vorhanden)
add.w d1,d0
move.b (a1),d1
add.w d1,d0 ; + 1. Ziffer (falls vorhanden)
rts ; zurück (D0 enthält Dezimalzahl)
;----Fehlermeldung ausgeben-------------------------------------------
error: tst.l Handle ; Filehandle = 0 ?
beq TxtOut ; ja, --> kein CLOSE
move.l Handle,d1
move.l DosBase,a6
jsr Close(a6) ; Datei schließen
TxtOut: move.l DosBase,a6
jsr Output(a6) ; Standard-Ausgabekanal ermitteln
move.l d0,ErrHandle
move.l d0,d1
clr.l d3
move.l ErrAdr,a0
move.b (a0)+,d3 ; Länge des Fehlertextes holen
move.l a0,d2 ; Fehlertext-Adresse
move.l DosBase,a6
jsr Write(a6) ; Fehlertext ausgeben
move.l #1,d1 ; Return-Code = Fehler
move.l DosBase,a6
jsr Exit(a6) ; zurück ins CLI
;---------------------------------------------------------------------
even
DosName: dc.b "dos.library",0
DosBase: dc.l 0
Pointer: dc.l 0
Handle: dc.l 0
ErrHandle:dc.l 0
ErrAdr: dc.l 0
Numbers: dc.b 0,0,0 ; Ziffernspeicher
Muls: dc.b 100,10,1,1 ; Multiplikatoren
even
FileName: blk.b 100,0 ; Speicher für Zieltext
Byte: dc.b 0
ComErr: dc.b 19,"Ein Komma fehlt !",13,10
OpenErr: dc.b 32,"Datei läßt sich nicht öffnen !",13,10
WriteErr: dc.b 25,"Fehler beim Schreiben !",13,10
ByteErr: dc.b 31,"Ein Byte ist größer als 255 !",13,10
NoBytErr: dc.b 21,"Vermisse Byte(s)...",13,10
NoFileErr: dc.b 35,"Bitte Zieldatei nicht vergessen !",13,10
NoParErr: dc.b 35,"--> CREATE <ziel>,byte[,byte,...]",13,10
SyntaxErr: dc.b 43,"Eine Dezimalzahl hat mehr als 3 Ziffern !",13,10